Skip to content

gh-151575: Deprecate passing file paths instead of URLs to mimetypes.guess_type()#151576

Open
NaveenKumarG-dev wants to merge 12 commits into
python:mainfrom
NaveenKumarG-dev:gh-mimetypes-guess-type-deprecation
Open

gh-151575: Deprecate passing file paths instead of URLs to mimetypes.guess_type()#151576
NaveenKumarG-dev wants to merge 12 commits into
python:mainfrom
NaveenKumarG-dev:gh-mimetypes-guess-type-deprecation

Conversation

@NaveenKumarG-dev

@NaveenKumarG-dev NaveenKumarG-dev commented Jun 17, 2026

Copy link
Copy Markdown

Context

mimetypes.guess_type() is intended for URLs, while mimetypes.guess_file_type() was introduced in Python 3.13 as the preferred API for file paths.

The implementation still accepts file paths without warning, despite the existing # TODO: Deprecate accepting file paths (in particular path-like objects) comment in Lib/mimetypes.py. This PR implements that TODO by deprecating file path inputs to guess_type() and directing users to guess_file_type() instead.

Changes Made

  • Implementation: Modified mimetypes.MimeTypes.guess_type() to emit a DeprecationWarning (stacklevel=2) when called with a file path instead of a URL.

  • Coverage: The warning triggers for plain strings that do not contain a valid URL scheme, as well as for bytes and os.PathLike objects. Valid URLs such as http://, ftp://, and data: continue to behave as before.

  • Testing: Added GuessTypeDeprecationTestCase to Lib/test/test_mimetypes.py covering path and URL inputs to verify warning behavior and prevent regressions.

  • Documentation:

    • Updated Doc/library/mimetypes.rst to document the runtime deprecation.
    • Added entries to Doc/whatsnew/3.16.rst and Doc/deprecations/pending-removal-in-future.rst.
  • NEWS: Added the required NEWS entry using blurb.

Rationale

This change aligns the runtime behavior with the documented distinction between URL handling (guess_type()) and file-path handling (guess_file_type()), while implementing the existing deprecation TODO in the source code.

Linked Issue

Fixes #151575


Code of Conduct and CLA

  • I have read the Python Developer's Guide
  • I have read the Python Code of Conduct
  • I have signed the Contributor License Agreement (CLA)

@read-the-docs-community

read-the-docs-community Bot commented Jun 17, 2026

Copy link
Copy Markdown

@NaveenKumarG-dev NaveenKumarG-dev changed the title gh-151575: Emit DeprecationWarning in mimetypes.guess_type() for file… gh-151575: Deprecate passing file paths instead of URLs to mimetypes.guess_type() Jun 17, 2026
Comment thread Doc/library/mimetypes.rst
.. soft-deprecated:: 3.13
Passing a file path instead of URL.
Use :func:`guess_file_type` for this.
.. deprecated:: 3.16

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schedule removal for Python 3.21. Also, please add a note that it was soft-deprecated since Python 3.13.

Comment thread Doc/library/mimetypes.rst Outdated
Comment on lines 31 to 32

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please also remove file paths/path-like objects here.

Comment thread Lib/test/test_mimetypes.py Outdated
type='image/jpeg', strict=True), ['.jpg', '.jpe', '.jpeg'])


class GuessTypeDeprecationTestCase(unittest.TestCase):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is already covered above, I don't see anything that adds new coverage? We also run our test suite with -Werror on buildbots, so we don't miss spurious warnings.

Comment thread Lib/mimetypes.py Outdated
"""Guess the type of a file which is either a URL or a path-like object.
"""Guess the type of a file based on its URL.

.. deprecated:: 3.16

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please remove this note.

Comment thread Lib/mimetypes.py Outdated
scheme = p.scheme
url = p.path
else:
# Input has no URL scheme — it is a file path, not a URL.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Input has no URL scheme — it is a file path, not a URL.

I think it's sufficiently clear from reading the logic, let's not repeat ourselves.

@@ -0,0 +1 @@
Emit DeprecationWarning when a file path is passed to :func:`mimetypes.guess_type`. Use :func:`mimetypes.guess_file_type` instead.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reword it like so please: "Deprecate passing X to X. Use X instead."

@StanFromIreland

Copy link
Copy Markdown
Member

Please do not use the Update Branch button unless necessary (e.g. fixing conflicts, jogging the CI, or very old PRs) as it uses valuable resources and results in spurious notifications. For more information see the devguide.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Deprecate passing file paths instead of URLs to mimetypes.guess_type()

2 participants